package ocio.services;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.opensymphony.xwork2.Action;
import ocio.actions.AddProductoAction;
import ocio.actions.ModificarProductoAction;
import ocio.beans.Producto;
//import java.util.Map;

import ocio.dao.ProductosDao;

/**
 * Clase encargada de ofrecer la lógica de negocio asociada a la clase Producto.
 * Ofrece funciones CRUD para la gestión de productos.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.beans.Producto
 * @see ocio.services.ServiceIF
 */
@SuppressWarnings("all")
public class ProductoService implements ServiceIF {

	ProductosDao ProductoDao;
	
	public ProductoService (){
		ProductoDao = new ProductosDao();
	}
	
	/**
	 * Solicita que se añada un producto con los datos recogidos en un objeto de la clase Action
	 * @param form objeto de la clase Action con los datos del producto.
	 */
	@Override
	public boolean add(Action form) {	
		Producto p = new Producto();
		AddProductoAction pform = (AddProductoAction) form;
		p.setNombre(pform.getNombre());
		if (ProductoDao.findByExample(p).size()==0) {  //Añadir Producto
			p.setDireccion(pform.getDireccion());
			p.setTelefono(pform.getTelefono());
			if (pform.getRol()==1){ //caso admin
				p.setAdmin(pform.getAdmin());
			} else { //caso proveedor
				p.setProveedor(pform.getProveedor());	
			}
			p.setDescripcion(pform.getDescripcion());
			p.setMunicipio(pform.getMunicipio());
			p.setFoto(pform.getFoto());
			p.setTipo(pform.getTipo());
			p.setProvincia(pform.getProvincia());
			p.setSubtipo(pform.getSubtipo());
			p.setOfertas(null);
			ProductoDao.attachDirty(p);
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * Solicita la lista de todos los productos que cumplan con los requisitos
	 * introducidos en un formulario y recogidos en un objeto de la clase Action
	 * @param form objeto de la clase Action con los datos de búsqueda.
	 * @return listaProductos Lista de todas los productos que cumplen los criterios de búsqueda.
	 */
	public List<Object> searchByFields(Action form){

		List<Object> resul = new ArrayList<Object>();
		List<Producto> listaProductos = new ArrayList<Producto>();
		Producto p = new Producto();
		AddProductoAction pform = (AddProductoAction) form;
		
		listaProductos = ProductoDao.findByExample(p);	
	    Iterator<Producto> itr = listaProductos.iterator();
	    while(itr.hasNext()) {
	         Object element = itr.next();
	         resul.add(element);
	    }		
	    return resul;
		
	}   

	/**
	 * Solicita la lista de todos los productos que cumplan con los requisitos
	 * recogidos en un objeto de la misma clase Producto
	 * @param producto Objeto de la clase Producto con los criteros de búsqueda.
	 * @return listaProductos Lista de todos los productos que cumplen los criterios de búsqueda.
	 */
	public List<Object> searchByFields(Producto producto){

		List<Object> resul = new ArrayList<Object>();
		List<Producto> listaProductos = new ArrayList<Producto>();
		
		listaProductos = ProductoDao.findByExample(producto);	
	    Iterator<Producto> itr = listaProductos.iterator();
	    while(itr.hasNext()) {
	         Object element = itr.next();
	         resul.add(element);
	    }		
	    return resul;
		
	}   
	
	/**
	 * Solicita la lista de todos los productos de la base de datos
	 * @return listaProductos Lista de todos los productos de la base de datos.
	 */
	public List<Producto> ListAllProductos(){

		List<Producto> listaProductos = new ArrayList<Producto>();
		listaProductos = ProductoDao.getAll();			
	    return listaProductos;
		
	}

	/**
	 * Actualiza los datos del productos en función de los campos recogidos en objeto de la clase Action.
	 * @param form Objeto de la clase Action con los datos del producto.
	 */
	@Override
	public void update(Action form) {
		// TODO Auto-generated method stub
		Producto p = new Producto();
		ModificarProductoAction pform = (ModificarProductoAction) form;
		p = (Producto)this.searchById(pform.getId());
		
		//Resto de campos sí modificables
		p.setNombre(pform.getNombre());
		p.setDescripcion(pform.getDescripcion());
		p.setMunicipio(pform.getMunicipio());
		p.setDireccion(pform.getDireccion());
		p.setTelefono(pform.getTelefono());
		
		ProductoDao.attachDirty(p);
	}
	
	/**
	 * Búsqueda de producto por identificador.
	 * @param id identifificador en la base de datos del producto.
	 * @return p Objeto correspondiente al producto con el identificador dado.
	 */
	public Object searchById(int id){
		Producto p;
		p = ProductoDao.findById(id);
		return p;
	}

	/**
	 * Borra el producto.
	 * @param o Objeto correspondiente al producto que se quiere borrar.
	 */
	@Override
	public void delete(Object o) {
		Producto p;
		p = (Producto)o;
		ProductoDao.delete(p);
	}

}
